package code

import "fmt"

type User struct {
	Age  int // int 8字节
	No   int
	Name string // string 16字节
	// 第一种
	Address Address
	// 第二种
	/**
	Address
	// 相当于
	Province string
	City     string
	**/
}

type Address struct {
	Province string
	City     string
}

func ReferenceStruct1() {
	var user User
	// var user []*User
	// userPoint := new(User)
	user.Age = 18
	fmt.Println(user)

	// 值传递, 修改后不影响原结构体
	ChangeStruct(user)
	fmt.Printf("修改后user: %v\n", user)

	// 尽量使用指针
	ChangeStructPinter(&user)
	fmt.Printf("指针修改后user: %v\n", user)
}

func ChangeStruct(user User) {
	user.Age = 20
}

func ChangeStructPinter(user *User) {
	user.Age = 20
}

// 第二个
type myInt int

func (m myInt) getValue() int {
	return int(m)
}

func ReferenceStruct2() {
	var mi myInt = 10
	fmt.Println(mi.getValue())
}

// 第三个
type Student struct {
	Name string
}

// 非指针是值传递, 不会影响原始结构体
// 指针是传递地址, 会影响结构体(推荐)
func (a *User) ChangeName(name string) {
	a.Name = name
}

type Hp int

func (h Hp) Get() Hp {
	return h
}

func ReferenceStruct3() {
	u := User{}
	u.ChangeName("张三")
	fmt.Println(u)
}
